package main

import "fmt"

/*
21_备忘录模式
概念：保存一个对象的某个状态，以便在适当的时候恢复对象。
*/
//备忘录模式用于保存程序内部状态到外部，又不希望暴露内部状态的情形。
type Memento interface {
}

type gameMemento struct {
	hp, mp int
}

type Game struct {
	hp, mp int
}

func (g *Game) Play(mpDelta, hpDelta int) {
	g.mp += mpDelta
	g.hp += hpDelta
}

func (g *Game) Save() Memento {
	return &gameMemento{
		hp: g.hp,
		mp: g.mp,
	}
}

func (g *Game) Load(m Memento) {
	gm := m.(*gameMemento)
	g.hp = gm.hp
	g.mp = gm.mp
}

func (g *Game) Status() {
	fmt.Printf("当前HP:%v，MP:%v\n", g.hp, g.mp)
}

func main() {
	game := &Game{
		hp: 100,
		mp: 10,
	}
	game.Status()
	memento := game.Save()
	game.Play(-2, -3)
	game.Load(memento)
	game.Status()
}
